/*
 * HashExtensible.h
 *
 *  Created on: 13/04/2014
 *      Author: ariel
 */

#ifndef HASHEXTENSIBLE_H_
#define HASHEXTENSIBLE_H_

#include <iostream>
using namespace std;
#include "Bloque.h"
#include "Utils.h"
#include "../../physical_layer/Archivo.h"
#include "../entities/Twit.h"
#include "../../utils/utiles.h"
#include "../../physical_layer/IDGenerator.h"

class HashExtensible {

private:
	Archivo* file_hash;
	Archivo* file_freeSpaces;
	Archivo* file_table;

public:
	HashExtensible();
	virtual ~HashExtensible();

	vector<int> getTable();
	vector<int> getIdblocksLibres();
	void setTable(vector<int> table);
	void setfreeSpaces(vector<int> bloquesLibres);

	//devuelve el bloque que contiene el registro pasado por parametro
	Bloque* search(Twit* registro);
	Twit* searchTwit(Twit* registro);

	Archivo* getFileFreeSpaces();
	Archivo* getFileHash();
	Archivo* getFileTable();

	void agregarEnArchivo(Bloque* bloque);
	Bloque* leerDeArchivo(int nroBloque);
	void updateBlockEnArchivo(Bloque* bloque);

	void agregarNroBloqueLibreEnArchivo(int nroBloqueLibre);
	int leerUnNroBloqueLibre();

	void reportBloques();

	bool doHashingAdd(Twit* registro);
	bool doHashingDelete(Twit* registro);

	void exportar();

private:

	bool dispersar(Elemento* Elemento_add, int pos_Bloque_inTable, Bloque* Bloque_found);

};


#endif /* HASHEXTENSIBLE_H_ */
